//
//  ALStatusViewModel.swift
//  Swift01
//
//  Created by Miaoyang on 16/4/13.
//  Copyright © 2016年 Miaoyang. All rights reserved.
//

import UIKit

import SDWebImage

class ALStatusViewModel: NSObject {
    
    // 单例
    static let sharedInstance: ALStatusViewModel = ALStatusViewModel()
    
    /// 加载本地数据
    private func loadLocalStatuses() {
        let path = NSBundle.mainBundle().pathForResource("statuses", ofType: "json")!
        let data = NSData(contentsOfFile: path)!
        
        // 函数抛出异常在函数后面有 throws,表示这段有可能会出现异常, 如果我们处理这个异常,程序是不会挂掉的,不处理就会挂掉
        // try!: 强制try, 有异常不处理,如果真的出现异常程序就挂了
        // do try catch: 处理异常,如果出现异常会走catch这个代码块,程序不会挂掉
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject]
            ALPrint("json: \(json)")
        } catch let error as NSError {
            ALPrint("json序列化异常: \(error)")
        }
    }
    
    /// 加载微博数据
    /// since_id: 下拉刷新获取最新微薄
    /// max_id: 上拉加载老的数据
    func loadStatus(since_id: Int64, max_id: Int64, loadStatusCallback: (statuses: [ALStatus]?, error: NSError?) -> ()) {
        // 1.urlString
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        // 2.参数
        /// [String : String?]: key是String类型,value是String或nil,数组或字典中的元素不能为nil
        var parameters: [String: AnyObject] = ["access_token": ALUserAccountViewModel.sharedInstance.userAccount!.access_token!]
        
        // 将since_id, max_id拼接到请求参数里面
        if since_id > 0 {   // 别人转了since_id
            parameters["since_id"] = NSNumber(longLong: since_id)
        } else if max_id > 0 {
            // 返回ID小于或等于max_id的微博, 不需要等于max_id的这条微博 max_id - 1
            parameters["max_id"] = NSNumber(longLong: max_id - 1)
        }
        
        let debug = false
        if debug {
            // 加载数据
            loadLocalStatuses()
            return
        }
        
        // 3.发送请求
        ALNetWorkTool.sharedInstance.GET(urlString, parameters: parameters, progress: nil, success: { (task, responseObject) -> Void in
            //            HMPrint("获取微博数据成功了: \(responseObject)")
            
            // 获取微博数据
            // 看是否能转成字典, 获取字典里面的内容
            if let dict = responseObject as? [String: AnyObject], let statusesDict = dict["statuses"] as? [[String: AnyObject]] {
                
                // 定义数组来保存转好的微博模型
                //                var statusModels = [HMStatus]()
                var statusModels: [ALStatus] = []
                
                // 遍历每个字典
                for dict in statusesDict {
                    // 字典转模型
                    let status = ALStatus(dict: dict)
                    
                    // 将模型添加到数组里面
                    statusModels.append(status)
                }
                
                // 02.缓存图片,将控制器传入的闭包cacheWebImage 的 loadStatusCallback
                self.cacheWebImage(statusModels, loadStatusCallback: loadStatusCallback)
                
                // 回到控制器,控制器会拿到数据,然后刷新界面
                //                loadStatusCallback(statuses: statusModels, error: nil)
            }
            
        }) { (task, error) -> Void in
            loadStatusCallback(statuses: nil, error: error)
        }
    }
    
    /// 缓存微博图片
    private func cacheWebImage(statuses: [ALStatus], loadStatusCallback: (statuses: [ALStatus]?, error: NSError?) -> ()) {
        // 创建任务组
        let group = dispatch_group_create()
        
        // 判断每个模型,看看是不是有图片要下载
        for status in statuses {
            var downloadURLs: [NSURL]?
            
            downloadURLs = status.storePicutreURLs
            
            // 如果原创没有图片要下载,看被转发微博是不是有图片要下载
            if downloadURLs == nil {
                downloadURLs = status.retweeted_status?.storePicutreURLs
            }
            
            // 看看是否有图片要下载
            if let urls = downloadURLs {
                // 只有一张图片的时候才需要提前下载.多张图片的时候可以等到tableView显示出来的时候在去下载也可以,这样可以提高微博加载速速
                if urls.count == 1 {
                    // 获取一张要下载的图片的url地址
                    let url = urls.first!
                    //                for url in urls {
                    // 使用SDWebImage去下载图片
                    // options: [SDWebImageOptions.AvoidAutoSetImage, SDWebImageOptions.CacheMemoryOnly]
                    // 异步任务之前进入组
                    dispatch_group_enter(group)
                    // SDWebImage异步下载图片
                    SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [], progress: nil, completed: { (image, error, _, _, _) -> Void in // 异步任务完成会回调这个闭包
                        dispatch_group_leave(group)
                        
                        if error != nil {
                            ALPrint("下载图片失败: \(url)")
                            return
                        }
                        
                        //                        HMPrint("下载图片完成: \(url)")
                    })
                }
            }
        }
        
        // 监听所有微博下载图片完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            ALPrint("SD下载所有图片完成")
            // SD下载所有图片完成,回调控制器,控制器会拿到数据,然后刷新界面
            loadStatusCallback(statuses: statuses, error: nil)
        }
    }
}
